/**
 * 并发请求控制
 * @param {Function[]}requestArr 请求函数组成的数组
 * @param {Number}limit 并发数量，默认为 3
 * @returns {Promise<any>[]} 每个请求的 promise 组成的数据
 */
export async function controlConcurrency(requestArr: ((...args: any[]) => Promise<any>)[], limit: number = 3) {
    // 如果并发数小于等于0，抛出错误
    if (limit <= 0) throw new Error("并发限制必须大于0");

    const results: Promise<any>[] = []; // 结果数组
    const running: Promise<any>[] = []; // 并发数组

    // 遍历请求数组
    for (const request of requestArr) {
        // 调用请求函数，返回一个Promise
        const promise = request();

        // 将Promise添加到结果数组
        results.push(promise);

        // 将Promise添加到并发数组
        running.push(promise);

        // 如果并发数组的长度大于限制数，则等待running数组中最先完成的promise
        if (running.length >= limit) {
            await Promise.race(running);
        }

        // 每次Promise完成，从并发数组中移除
        promise.finally(() => {
            const index = running.indexOf(promise);
            if (index !== -1) running.splice(index, 1);
        });
    }

    // 返回所有Promise的结果
    return results;
}
